package com.swf.seed.algorithms.problem;

/**
 * ClassName: TowersofHanoi 汉诺塔<br/>
 * 
 * Function: 如果柱子标为ABC，要由A搬至C，在只有一个盘子时，就将它直接搬至C，当有两个盘<br/>
 * 子，就将B当作辅助柱。如果盘数超过2个，将第三个以下的盘子遮起来，就很简单了，每次处<br/>
 * 理两个盘子，也就是：A->B、A->C、B->C这三个步骤，而被遮住的部份，其实就是进入程式<br/>
 * 的递回处理。事实上，若有n个盘子，则移动完毕所需之次数为2^n-1，所以当盘数为64时，则<br/>
 * 所需次数为：2^64-1=18446744073709551615为5.05390248594782e+16年，也就是约5000世 纪 ，<br/>
 * 如果对这数字没什幺概念，就假设每秒钟搬一个盘子好了，也要约5850亿年左右。 <br/>
 * 
 * Reason: 河内之塔(TowersofHanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的，河内为越战时<br/>
 * 北越的首都，即现在的胡志明市；1883年法国数学家EdouardLucas曾提及这个故事，据说创世<br/>
 * 纪时Benares有一座波罗教塔，是由三支钻石棒（Pag）所支撑，开始时神在第一根棒上放置64<br/>
 * 个由上至下依由小至大排列的金盘（Disc），并命令僧侣将所有的金盘从第一根石棒移至第三根<br/>
 * 石棒，且搬运过程中遵守大盘子在小盘子之下的原则，若每日仅搬一个盘子，则当盘子全数搬<br/>
 * 运完毕之时，此塔将毁损，而也就是世界末日来临之时。 <br/>
 * 
 * date: 2015-1-20 上午10:03:04 <br/>
 *
 * @author shenwf10476
 * @version
 * @since JDK 1.6
 */
public class TowersofHanoi {
	void hanoi(int n,char a,char b,char c){
		if (n == 1){
			System.out.println(a + "---->" + c);//如果为1，直接从A移到C
		}else{
			hanoi(n-1, a, c, b);//将n-1个盘子从a移到b
			System.out.println(a + "---->" + c);//将最底下的盘子移到c
			hanoi(n-1, b, a, c);//n-1个盘子现在在b上，需要移动到c
		}
	}
	
	public static void main(String[] args) {
		new TowersofHanoi().hanoi(3, 'A', 'B', 'C');
	}
}
